package com.dy.design_pattern_study.factory_method.dome2;

import com.dy.design_pattern_study.factory_method.dome2.method.IFactory;
import com.dy.design_pattern_study.factory_method.dome2.method.impl.StudentFactory;
import com.dy.design_pattern_study.factory_method.dome2.simple.SimpleFactory;

/**
 * @CreateBy zhangdingyi
 * @Date 2023-03-22
 * @Content 这里实现的是简单工厂
 */
public class ConsoleMain {
    public static void main(String[] args) {
        LeiFeng xueleifeng = new Student();

        xueleifeng.BuyRice();
        xueleifeng.Sweep();
        xueleifeng.Wash();
    }

    /**
     * 工厂方法模式 --感觉和简单工厂模式大同小异
     * 如果要换成‘社区志愿者’也还是要修改代码，但是只需要修改一处就可以了。
     * 工厂方法克服了简单工厂违背开放-封闭原则的缺点，又保持了封装对象创建过程的优点
     *
     * 工厂方法模式是简单工厂模式的进一步抽象和推广
     *
     * 工厂方法模式，还可以 利用‘反射’来解决避免分支判断的问题
     */
    public static void methodFactory() {
        IFactory factory = new StudentFactory();
        LeiFeng student = factory.CreateLeiFeng();
        student.Sweep();
        student.Wash();
        student.BuyRice();
    }
    /**
     * 简单工厂模式 --简单工厂模式的话，得创建多个对象
     */
    public static void simpleFactory() {
        LeiFeng student1 = SimpleFactory.createLeiFeng("学雷锋的学生");
        student1.Sweep();
        LeiFeng student2 = SimpleFactory.createLeiFeng("学雷锋的学生");
        student1.Wash();
        LeiFeng student3 = SimpleFactory.createLeiFeng("学雷锋的学生");
        student1.BuyRice();
    }
}
